package cn.com.cifi.mars.mapper.mars;


import cn.com.cifi.mars.bean.bo.ConfirmAndFuinalizeBO;
import cn.com.cifi.mars.bean.dto.CarryOverTimeDto;
import cn.com.cifi.mars.bean.dto.SignPlanDto;
import cn.com.cifi.mars.entity.*;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.ibatis.annotations.Param;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;

/**
 * <p>
 * 签约计划版本表 Mapper 接口
 * </p>
 *
 * @author yyd
 * @since 2019-11-08
 */
public interface SignPlanVersionMapper extends BaseMapper<SignPlanVersion> {

	/**
	 * 查询该分期下的签约计划审批状态，是否可以进行创建版本
	 * @param projectId
	 * @param versionStates
	 * @param isDel
	 * @return
	 */
	List<SignPlanVersion> selectByVersionStatesAndProjectId(@Param("projectId") String projectId,@Param("versionStates") List<String> versionStates,@Param("isDel") int isDel);

	/**
	 * 查询该项目下的签约计划审批状态,是否可以进行创建版本
	 * @param projectFid
	 * @param versionStates
	 * @param isDel
	 * @return
	 */
	List<SignPlanVersion> selectByVersionStatesAndProjectFId(@Param("projectFid") String projectFid,@Param("versionStates") List<String> versionStates,@Param("isDel") int isDel);


	/**
	 * 查询最新版签约计划
	 * @param projectfId 分期id
	 * @param versionTypes 版本类型列表
	 * @param versionStates 版本状态列表
	 * @param isDel 是否删除
	 * @return
	 */
	SignPlanVersion selectNewesVersion(@Param("projectfId") String projectfId,
									   @Param("versionTypes") List<String> versionTypes,
									   @Param("versionStates") List<String> versionStates,
									   @Param("isDel") int isDel);

	/**
	 * 查询指定年月该分期版本类型最新版签约计划
	 * @param projectfId 分期id
	 * @param versionTypes 版本类型列表
	 * @param versionStates 版本状态列表
	 * @param yearMonth yyyy-MM
	 * @param isDel 是否删除
	 * @return
	 */
	SignPlanVersion selectNewesVersionAndTime(@Param("projectfId") String projectfId,
									   @Param("versionTypes") List<String> versionTypes,
									   @Param("versionStates") List<String> versionStates,
									   @Param("yearMonth") String yearMonth,
									   @Param("isDel") int isDel);

	/**
	 * 查询该分期最新版签约计划
	 * @param projectfId 分期id
	 * @param versionTypes 版本类型
	 * @param isDel 是否删除
	 * @return
	 */
	SignPlanVersion selectNewesSignVersionByVersionType(@Param("projectfId") String projectfId, @Param("versionType")String versionTypes,@Param("isDel") int isDel);

	/**
	 * 查询该分期最新版签约计划
	 * @param projectfId 分期id
	 * @param isDel 是否删除
	 * @return
	 */
	SignPlanVersion selectNewesSignVersion(@Param("projectfId") String projectfId,@Param("isDel") int isDel);


	/**
	 * 查询该分期版本类型的货值计划列表
	 * @param projectFId 分期id
	 * @param priceVersionTypes 版本类型列表
	 * @param isDel 是否删除
	 * @return
	 */
	List<PriceVersion> selectPriceByVersionTypes(@Param("projectFId") String projectFId, @Param("priceVersionTypes") List<String> priceVersionTypes,
                                                 @Param("isDel") int isDel);

	/**
	 * 查询指定时间该分期版本类型的货值计划列表
	 * @param projectFId 分期id
	 * @param priceVersionTypes 版本类型列表
	 * @param isDel 是否删除
	 * @return
	 */
	List<PriceVersion> selectPriceByVersionTypesAndTime(@Param("projectFId") String projectFId, @Param("priceVersionTypes") List<String> priceVersionTypes,
												 @Param("yearMonth")String yearMonth,@Param("isDel") int isDel);

	/**
	 * 查询分期下最新供货版本
	 * @param projectFId 分期id
	 * @param versionTypes 版本类型列表
	 * @param isDel 是否删除
	 * @return
	 */
	SupplyPlanVersion selectSupplyPlanByProjectFid(@Param("projectFId")String projectFId,@Param("versionTypes") List<String> versionTypes,
												   @Param("isDel") int isDel);

    /**
     * 根据版本id和类型查询供货计划详细信息
     * @param versionId 供货版本id
     * @param isDel 是否删除
     * @param type 层级类型
	 * @Param isSupply 是否已供
     * @return
     */
    List<SupplyPlanVersionDetail>selectSupplyByPlanDetailVersionId(@Param("versionId")String versionId, @Param("isDel") int isDel,
																   @Param("type")String type,@Param("isSupply")int isSupply);

	/**
	 * 获取结转日期
	 * @param versionId 价格版本id
	 * @param priceOrgId 价格版本详情1id
	 * @param isDel 是否删除
	 * @return
	 */
    CarryOverTimeDto selectPriceByProductId(@Param("versionId") String versionId,@Param("priceOrgId")String priceOrgId, @Param("isDel") int isDel);

	/**
	 * 根据id查询签约版本
	 * @param versionId 签约版本id
	 * @param isDel 是否删除
	 * @return
	 */
    SignPlanVersion selectByIdAndDel(@Param("versionId") String versionId,@Param("isDel") int isDel);

	/**
	 * 查询分期下该版本的签约计划版本列表
	 * @param projectFid 分期id
	 * @param versionType 版本类型
	 * @param isDel 是否删除
	 * @return
	 */
	List<SignPlanVersion> selectByProjectFidAndVersionType(@Param("projectFid") String projectFid,@Param("versionType") String versionType,
														   @Param("isDel") int isDel);


	/**
	 * 查询分期下最新版本类型
	 * @param projectFid
	 * @param isDel
	 * @return
	 */
	String selectNewVersionType(@Param("projectFid") String projectFid,@Param("isDel") int isDel);


	/**
	 * 根据项目id和版本状态查询签约计划信息  预算版才根据版本类型查询 
	 * @param projectId
	 * @param versionStates
	 * @param versionType
	 * @param isDel
	 * @return
	 */
	List<SignPlanVersion>selectByProjectIdAndVersionState(@Param("projectId")String projectId,@Param("versionStates")List<String> versionStates,@Param("versionType")String versionType,@Param("isDel") int isDel);


	/**
	 * 查询预算版供货计划
	 * @param projectFid 分期id
	 * @param versionType 版本类型
	 * @param versionIdentify 版本标识
	 * @param isDel 是否删除
	 * @return
	 */
	SupplyPlanVersion selectBudgetSupplyPlan(@Param("projectFid")String projectFid,@Param("versionType")String versionType,
											 @Param("versionIdentify")String versionIdentify,@Param("compileYear") String compileYear,
											 @Param("versionAttr") String versionAttr, @Param("isDel") int isDel);

	/**
	 * 查询预算版签约计划
	 * @param projectFid 分期id
	 * @param versionType 版本类型
	 * @param versionIdentify 版本标识
	 * @param versionState 版本状态
	 * @param isDel 是否删除
	 * @return
	 */
	SignPlanVersion selectBudgetSignPlan(@Param("projectFid")String projectFid,@Param("versionType")String versionType,
										 @Param("versionIdentify")String versionIdentify,
										 @Param("versionState")String versionState, @Param("isDel") int isDel);


	/**
	 * 查询审批中的数量
	 * @param projectId
	 * @return
	 */
	int checkSubmitToOA(@Param("projectId")String projectId,@Param("isDel") int isDel,@Param("versionState")String versionState);

	/**
	 * 修改签约计划审批状态
	 */
	int updateSignPlanVersionState(@Param("versionState")String versionState, @Param("id") String id,@Param("time") LocalDateTime time);

	/**
	 * 查看签约计划的项目是否存在
	 * @param projectId
	 * @param isDel
	 * @return
	 */
	int checkApprovedVersionIsNull(@Param("projectId")String projectId,@Param("isDel") int isDel);

	/**
	 * 审批校验 查询是否存在项目下的状态中的版本
	 * @param projectId
	 * @param isDel
	 * @param versionStates
	 * @return
	 */
	int checkVersion(@Param("projectId")String projectId,@Param("isDel") int isDel,@Param("versionStates")List<String> versionStates);


	/**
	 * 根据projectId查询需要审批的项目的分期
	 * @param projectId
	 * @param isDel
	 * @return
	 */
	List<SignPlanVersion> selectApprovedProject(@Param("projectId")String projectId,@Param("isDel") int isDel,@Param("versionStates")List<String> versionStates);

	/**
	 * 查询项目下所有分期最新的(指定状态) 版本
	 * @param projectfId
	 * @param versionStates
	 * @param isDel
	 * @return
	 */
	SignPlanVersion selectLastByprojectfIdAndVersionStates(@Param("projectfId")String projectfId,@Param("versionStates")List<String> versionStates,@Param("isDel") int isDel);

	/**
	 * 根据版本id获取版本信息
	 * @param versionIds
	 * @param isDel
	 * @return
	 */
	List<SignPlanVersion>selectByVersionIds(@Param("versionIds") List<String> versionIds,@Param("isDel") int isDel);
	
	/**
	 * 获取本次编制的版本id
	 * @param projectId
	 * @param isDel
	 * @param versionStates
	 * @return
	 */
	List<String>selectOrganizationIds(@Param("projectId")String projectId
			,@Param("isDel") int isDel, @Param("versionStates")List<String> versionStates);


	/**
	 * 查询版本下的状态信息
	 * @param versionIds
	 * @param isDel
	 * @param versionStates
	 * @return
	 */
	List<SignPlanVersion> selectVersionIdsStateList(@Param("versionIds")List<String>versionIds,@Param("isDel") int isDel,@Param("versionStates")List<String> versionStates);

	/**
	 * 查询各分期最新版本列表
	 * @param versionType 版本类型
	 * @param yearMonth 年月字符串（yyyy-MM）
	 * @return
	 */
	List<SignPlanVersion> selectLatestVersionByVersionTypeAndAffiliationMonth(@Param("versionType") String versionType,@Param("yearMonth") String yearMonth,@Param("isDel") int isDel);

	/**
	 * 查询分期下指定月份最新确认供货的供货计划版本
	 * @param confirmAndFuinalizeBO 确认与供货条件
	 * @return
	 */
	SupplyPlanVersion selectConfirmStatusSupplyPlan(ConfirmAndFuinalizeBO confirmAndFuinalizeBO);

	/**
	 * 查询分期下指定月份之前最新确认或定稿的供货计划版本
	 * @param confirmAndFuinalizeBO 确认与供货条件
	 * @return
	 */
	SupplyPlanVersion selectSupplyPlanByAffiliationMonth(ConfirmAndFuinalizeBO confirmAndFuinalizeBO);

	/**
	 * 查询使用供货计划版本的有效签约版本
	 * @param supplyVersionId 供货版本id
	 * @param isDel 是否删除
	 * @return
	 */
    List<SignPlanVersion> supplyBoolean(@Param("supplyVersionId")String supplyVersionId,@Param("isDel") int isDel);

	/**
	 * 更新分期最新版本
	 * @param projectfId 分期id
	 * @param isStageNewest
	 */
	void updateIsStageNewestByProjectfId(@Param("projectfId")String projectfId,@Param("isStageNewest") int isStageNewest);

	/**
	 * 查询项目下有效分期
	 * @param projectId 项目id
	 * @param isDel 是否删除
	 * @return
	 */
	List<String> selectProjectfIdsByProjectId(@Param("projectId") String projectId,@Param("isDel") int isDel);

	/**
	 * 判断货值版本列表中在签约计划中被有效使用的版本列表
	 * @param versionIds 货值版本id列表
	 * @param isDel 是否删除
	 * @return
	 */
	List<String> priceBoolean(@Param("versionIds") List<String> versionIds, @Param("isDel") int isDel);

	/**
	 * 查询当前分期下是否存在考核版签约计划
	 * @param projectfId 分期id
	 * @param versionType 版本类型
	 * @param isAssessment 是否考核版
	 * @param isDel 是否删除
	 * @return
	 */
	int selectIsAssessmentByProjectfId(@Param("projectfId") String projectfId,@Param("versionType")String versionType,
									   @Param("isAssessment")int isAssessment,@Param("isDel") int isDel);

	/**
	 * 清除指定分期下考核版标记
	 * @param projectfId 分期id
	 * @param isDel  是否删除
	 */
    void updateIsAssessmentVersionByProjectfId(@Param("projectfId")String projectfId,@Param("isDel") int isDel);

	/**
	 * 查询基于供货考核版生成的第一版签约计划
	 * @param sourceSupplyId
	 * @param isDel
	 * @return
	 */
	SignPlanVersion selectBySourceSupplyId(@Param("sourceSupplyId") String sourceSupplyId,@Param("isDel") int isDel);

	/**
	 * 查询分期下最新审批通过的投资考核版
	 * @param projectfId 分期id
	 * @param isAssessmentVersion 是否考核版（0否,1是）
	 * @param versionState 版本状态
	 * @param isDel 是否删除
	 * @return
	 */
    SignPlanVersion selectByIsAssessmentVersion(@Param("projectfId")String projectfId,@Param("isAssessmentVersion")int isAssessmentVersion,
												@Param("versionState")String versionState,@Param("isDel") int isDel);

	List<Map<String, Object>> selectTodoId(@Param("versionId")String versionId);

	/**
	 * 查询签约计划全部项目
	 * @return
	 */
	Set<String> selectProjectIdAll();


	/**
	 * 查询分期数据
	 * @param stagerId
	 * @param yearMonth
	 * @return
	 */
    DmDmValueReport selectDmValueReportByStageId(@Param("stagerId") String stagerId,@Param("yearMonth") String yearMonth);

	/**
	 * 分期下已售版本
	 * @param projectfId
	 * @param yearMonth
	 * @param versionState
	 * @return
	 */
	SignPlanVersion selectContainSale(@Param("projectfId") String projectfId,@Param("yearMonth") String yearMonth,
									  @Param("versionState")String versionState);


	/**
	 * 查询分期是否可售或阶段性自持
	 * @param sourcePriceId 来源供货id
	 * @return
	 */
	Integer selectSupplyIsSalableOrStageSelfSustainment(@Param("sourcePriceId") String sourcePriceId,@Param("orgType") String orgType,
														@Param("Salable") String Salable, @Param("stageSelfSustainment") String stageSelfSustainment);

	/**
	 * 查询指定年月分期下最新的签约版本
	 * @param yearMonth
	 * @return
	 */
	List<SignPlanVersion> selectLatestVersionByAffiliationMonth(@Param("yearMonth") String yearMonth);


	List<SignPlanVersion> selectLatestVersionByAffiliationMonthAndVersionTypeAndVersionState(
			@Param("yearMonth") String yearMonth, @Param("projectId") String projectId,
			@Param("versionType")String versionTypes, @Param("versionState")String versionState,
			@Param("isDel") int isDel);
	/**
	 * 查询指定年月分期下最新的签约版本
	 * @param projectId
	 * @return
	 */
	List<SignPlanVersion> selectLatestVersionByProjectId(@Param("projectId") String projectId,@Param("yearMonth") String yearMonth);

	List<SignPlanDto> selectListByVersionType(@Param("versionType")String versionType, @Param("isDel")int isDel, @Param("status")String status);

	List<SignPlanVersion> selectByProjectId(@Param("projectId") String regionId, @Param("isDel") int isDel);

	List<SignPlanVersion> selectByProjectIdLeYearMonth(@Param("projectId") String regionId,@Param("yearMonth") String yearMonth, @Param("isDel") int isDel);

	List<SignPlanVersion> selectByProjectfId(@Param("projectfId")String projectfId,@Param("isDel") int isDel);

	List<ReturnPlanVersion> selectListByStageIdAndVersionType(@Param("projectfId")String projectfId, @Param("versionType")String versionType, @Param("isDel") int isDel);
}
